package mn.slide.laborberlin.db;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import mn.slide.laborberlin.model.Anhang;
import mn.slide.laborberlin.model.Eintrag;
import mn.slide.laborberlin.model.EntragData;
import mn.slide.laborberlin.model.History;
import mn.slide.laborberlin.model.Kapitel;
import mn.slide.laborberlin.model.Method;
import mn.slide.laborberlin.model.SubUeberSchrift;
import mn.slide.laborberlin.model.UeberSchrift;
import mn.slide.laborberlin.model.UnterSuchung;
import android.content.Context;
import android.util.Log;

public class DatabaseManager {
	static private DatabaseManager instance;

	static public void init(Context ctx) {
		if (null == instance) {
			instance = new DatabaseManager(ctx);
		}
	}

	static public DatabaseManager getInstance() {
		return instance;
	}

	private DatabaseHelper helper;

	private DatabaseManager(Context ctx) {
		helper = new DatabaseHelper(ctx);
	}

	private DatabaseHelper getHelper() {
		return helper;
	}

	public void upgradeDataBase() {
		helper.upgrade();
	}

	public List<Eintrag> getEintragKapi(Kapitel kId) {
		List<Eintrag> eintrag = null;
		try {
			eintrag = getHelper().getEintragDao().queryBuilder()
					.orderBy("ZKAPITELID", true).query();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return eintrag;
	}

	public List<Kapitel> getAllKapitel() {
		List<Kapitel> kapitel = null;
		try {
			kapitel = getHelper().getKapitelDao().queryBuilder()
					.orderBy("ZKAPITELID", true).query();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return kapitel;
	}

	public List<UnterSuchung> getAllUnterSuchung() {
		List<UnterSuchung> kapitel = null;
		try {
			kapitel = getHelper().getUnterSuchungDao().queryForAll();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return kapitel;
	}

	public List<UeberSchrift> getAllUeberSchrift() {
		List<UeberSchrift> kapitel = null;
		try {
			kapitel = getHelper().getUeberSchriftDao().queryForAll();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return kapitel;
	}

	public List<SubUeberSchrift> getAllSubUeberSchrift() {
		List<SubUeberSchrift> kapitel = null;
		try {
			kapitel = getHelper().getSubUeberSchriftDao().queryForAll();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return kapitel;
	}

	public List<Anhang> getAllAnhangs() {
		List<Anhang> anhang = null;
		try {
			anhang = getHelper().getAnhangDao().queryForAll();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return anhang;
	}

	public List<History> getAllHistory() {
		List<History> history = null;
		try {
			history = getHelper().getHistoryDao().queryForAll();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return history;
	}

	public void addKapitel(Kapitel kapitel) {
		try {
			getHelper().getKapitelDao().create(kapitel);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addAnhang(Anhang anhang) {
		try {
			getHelper().getAnhangDao().create(anhang);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addUnterSuchung(UnterSuchung unter) {
		try {
			getHelper().getUnterSuchungDao().create(unter);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addUeberSchrift(UeberSchrift ueber) {
		try {
			getHelper().getUeberSchriftDao().create(ueber);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addSubUeberSchrift(SubUeberSchrift subUeber) {
		try {
			getHelper().getSubUeberSchriftDao().create(subUeber);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addEintrag(Eintrag eintrag) {
		try {
			getHelper().getEintragDao().create(eintrag);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addMethod(Method method) {
		try {
			getHelper().getMethodDao().create(method);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void addHistory(History history) {
		try {
			getHelper().getHistoryDao().create(history);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public List<Eintrag> getUnterId(int id) {
		List<Eintrag> methods = null;
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ZKAPITEL", id);
		try {
			methods = getHelper().getEintragDao().queryForFieldValues(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if (methods.size() > 0)
			return methods;
		else {
			return null;
		}
	}

	public Method getMethodTitel(String titel) {
		List<Method> methods = null;
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ZTITEL", titel);
		try {
			methods = getHelper().getMethodDao().queryForFieldValues(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		if (methods.size() > 0)
			return methods.get(0);
		else {
			return null;
		}
	}

	// public Kapitel getKapitelWithId(int kapitelId) {
	// Kapitel kapitel = null;
	// try {
	// kapitel = getHelper().getKapitelDao().queryForId(kapitelId);
	// } catch (SQLException e) {
	// e.printStackTrace();
	// }
	// return kapitel;
	// }
	//
	// public UeberSchrift getUeberSchriftWithId(int kapitelId) {
	// UeberSchrift kapitel = null;
	// try {
	// kapitel = getHelper().getUeberSchriftDao().queryForId(kapitelId);
	// } catch (SQLException e) {
	// e.printStackTrace();
	// }
	// return kapitel;
	// }
	// public SubUeberSchrift getSubUeberSchriftWithId(int kapitelId) {
	// SubUeberSchrift kapitel = null;
	// try {
	// kapitel = getHelper().getSubUeberSchriftDao().queryForId(kapitelId);
	// } catch (SQLException e) {
	// e.printStackTrace();
	// }
	// return kapitel;
	// }

	public History getHistoryWithId() {
		History history = null;
		try {
			history = getHelper().getHistoryDao().queryForId(1);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return history;
	}

	public List<UnterSuchung> getFaveriteList() {
		List<UnterSuchung> unter = new ArrayList<UnterSuchung>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("Z3FAVORITESET", 1);
		try {
			unter = getHelper().getUnterSuchungDao().queryForFieldValues(map);
			Collections.sort(unter, new Comparator<UnterSuchung>() {
				@Override
				public int compare(UnterSuchung e1, UnterSuchung e2) {
					return e2.getMerkenDate().compareTo(e1.getMerkenDate());
				}
			});

		} catch (SQLException e) {
			e.printStackTrace();
		}
		return unter;
	}

	public List<UnterSuchung> getHistoryList() {
		List<UnterSuchung> unter = new ArrayList<UnterSuchung>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("Z3HISTORYSET", 1);
		try {
			unter = getHelper().getUnterSuchungDao().queryForFieldValues(map);
			Collections.sort(unter, new Comparator<UnterSuchung>() {
				@Override
				public int compare(UnterSuchung e1, UnterSuchung e2) {
					Log.v("Date",
							e2.getVerlaufDate() + " " + e1.getVerlaufDate());
					return e2.getVerlaufDate().compareTo(e1.getVerlaufDate());
				}
			});
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return unter;
	}

	public List<EntragData> getSearchResult(String k) {
		List<UnterSuchung> unter = new ArrayList<UnterSuchung>();
		List<UeberSchrift> ueber = new ArrayList<UeberSchrift>();
		List<SubUeberSchrift> subUeber = new ArrayList<SubUeberSchrift>();
		List<EntragData> result = new ArrayList<EntragData>();
		try {
			unter = getHelper().getUnterSuchungDao().queryBuilder().where()
					.like("ZNAME", "%" + k + "%").or()
					.like("ZKUERZEL", "%" + k + "%").query();
			result.addAll(unter);
			ueber = getHelper().getUeberSchriftDao().queryBuilder().where()
					.like("ZVALUE", "%" + k + "%").query();
			result.addAll(ueber);
			subUeber = getHelper().getSubUeberSchriftDao().queryBuilder()
					.where().like("ZVALUE", "%" + k + "%").query();
			result.addAll(subUeber);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return result;
	}

	public List<UnterSuchung> getUnterFromUeberSchrift(int id) {
		List<UnterSuchung> unter = new ArrayList<UnterSuchung>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ZUEBERSCHRIFT", id);
		try {
			unter = getHelper().getUnterSuchungDao().queryForFieldValues(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return unter;
	}

	public List<UnterSuchung> getUnterFromSubUeberSchrift(int id) {
		List<UnterSuchung> unter = new ArrayList<UnterSuchung>();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("ZSUBUEBERSCHRIFT", id);
		try {
			unter = getHelper().getUnterSuchungDao().queryForFieldValues(map);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return unter;
	}

	public Anhang getAnhangWithId(int anhangId) {
		Anhang anhang = null;
		try {
			anhang = getHelper().getAnhangDao().queryForId(anhangId);
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return anhang;
	}

	public void refreshKapitel(Kapitel kapitel) {
		try {
			getHelper().getKapitelDao().refresh(kapitel);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void refreshAnhang(Anhang anhang) {
		try {
			getHelper().getAnhangDao().refresh(anhang);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void refreshMethod(Method method) {
		try {
			getHelper().getMethodDao().refresh(method);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void refresHistory(History history) {
		try {
			getHelper().getHistoryDao().refresh(history);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void refreshUnter(UnterSuchung unter) {
		try {
			getHelper().getUnterSuchungDao().refresh(unter);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void updateAnhang(Anhang anhang) {
		try {
			getHelper().getAnhangDao().update(anhang);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void updateAnhang(Kapitel kapitel) {
		try {
			getHelper().getKapitelDao().update(kapitel);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void updateMethod(Method method) {
		try {
			getHelper().getMethodDao().update(method);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

	public void updateUnter(UnterSuchung unter) {
		try {
			getHelper().getUnterSuchungDao().createOrUpdate(unter);
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
